<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
<script>

// 固艾蒙 -> 我爱你

// Symbol 数据类型
// ES6提供的一种新的数据类型
// Symbol表示一个独一无二的值（唯一的值）

// 创建一个Symbol值
let s1 = Symbol();
let s2 = Symbol();

console.log( s1 );// Symbol() -> 独一无二的值
console.log( s2 );// Symbol() -> 独一无二的值
console.log( s1 == s1 );// true
console.log( s1 == s2 );// false
console.log( s1 === s2 );// false
console.log( typeof s1 );// 'symbol'

console.log( NaN === NaN );// false
console.log( Object.is(NaN,NaN) );// true

// 创建Symbol值时，可以传入一个标识符（不会影响生成的唯一的值）
let s3 = Symbol('age');
console.log( s3 );// Symbol(age)

// Symbol值用作对象的属性名
// 好处：
// 1.保证对象的属性不会被覆盖（唯一性）
// 2.起到提高对象属性的私密性(一些正常的操作不会访问到该属性)

let obj = {
    name: '老王',
    // age: 35,
    [Symbol('age')]: 35,
    [Symbol('money')]: 888888888,
    sex: '女',
    [s1]: 123
}

// obj[Symbol('age')] = 36;

// console.log( obj );// {name: '老王', sex: '女', Symbol(age): 35, Symbol(money): 888888888, Symbol(age): 36}

// console.log( obj[Symbol('age')] );// undefined

// console.log( obj[s1] );// 123

// for (let key in obj){
//     console.log( key );// name  sex
// }

// Object.getOwnPropertySymbols(obj)获取obj对象的所有Symbol属性名
let arr = Object.getOwnPropertySymbols(obj);
console.log( arr );// [Symbol(age), Symbol(money)]
console.log( obj[arr[1]] );// 888888888


// 模拟Symbol函数：
function mySymbol(){
    return Date.now()*Math.random();
}
console.log( mySymbol() );// 863607618774.7543 => mySymbol()
console.log( mySymbol() );// 1629939420176.26 => mySymbol()
console.log( mySymbol('sex') );// 173758875923.38782 => mySymbol(sex)

// 范海辛
// 刀锋战士
// 黑夜传说

</script>
</body>
</html>